C++20 コア言語機能読書会vol.1
開催日時
2022年2月16日(水) 19:30~21:00
開催URL
参加人数
5人
1 はじめに
雑談タイム
参加者にも Scrapbox 編集権限を与えてみる(テスト)
プロファイル駆動開発について
2 大きな機能
2.1 <=>
p.11 の bool operator==(const C&) const 実装にバグがある
一つ目が同じ値だったらその時点でtrueを返してしまう
デフォルト定義される<=>の中間コードを出力してほしい
構造体でintとfloatが混じっている場合、返り値の型orderingはどうなる?
弱い型に合わせてpartial_orderingになる
code:cpp
struct C
{
int n;
double d;
auto operator<=>(const C&) const = default;
};
int main()
{
C a{ 10, 2.2 }, b{ 10, 2.2 };
a < b;
}
https://scrapbox.io/files/620cdb0b5191a80023b2953a.png
https://scrapbox.io/files/620cdb6276a472001d5c82f8.png
struct { int, double } → partial
struct { int, int } → strong
VS2022 は Cascadia Font というフォント
2.1.1 異種型間比較と比較演算子の自動生成
自作分数クラスとか多倍長整数を作ったときに便利そう
明示的定義が必要なのはH型同士の比較のため(18個ってどういう計算?)
「異種型」間比較だけだとH同士の比較は当てはまらなくない?
2×2=4というより2+2=4
この2行があることで逆に誤解を招いてしまう可能性があるね
検証コード
code:cpp
struct H
{
int n;
auto operator<=>(const H&) const = default;
//bool operator==(const H&) const = default;
friend auto operator<=>(const H& self, int m)
{
return self.n <=> m;
}
friend bool operator==(const H& self, int m)
{
return self.n == m;
}
};
int main()
{
H h = { 10 };
int n = 20;
std::cout << (h == h) << '\n'; //
std::cout << (h != h) << '\n'; //
std::cout << (h < h) << '\n';
std::cout << (h <= h) << '\n';
std::cout << (h > h) << '\n';
std::cout << (h >= h) << '\n';
std::cout << (h == n) << '\n';
std::cout << (h != n) << '\n';
std::cout << (h < n) << '\n';
std::cout << (h <= n) << '\n';
std::cout << (h > n) << '\n';
std::cout << (h >= n) << '\n';
std::cout << (n == h) << '\n';
std::cout << (n != h) << '\n';
std::cout << (n < h) << '\n';
std::cout << (n <= h) << '\n';
std::cout << (n > h) << '\n';
std::cout << (n >= h) << '\n';
}
2.1.2 符号付整数型の内部表現は2 の補数であると規定
補数気にしてなかった!
1 の補数だと 整数型に 0 と -0 が存在
2の補数だとINT_MINを符号反転させた時に問題になるよね
値変わらない
実際は問題になることはほぼないはず
2.2 コンセプト
次回はここから
お悩み雑談室
この時間になると目がしぱしぱする…
老眼…
周りの明るさに輝度合わせるモニタおすすめ
目の方向が水平より下を向くように
プロファイル駆動開発の続き
グラフィックの話
次回から祝日でも開催したいと思います
必ず平日開催していたのはオフライン開催時の名残(会社の帰りに大阪で)
最後に
勉強会 talk.cpp